 @ Title: Primes               		        Filename: primes.s
 @ Author: Celaya Carranco Fausto Javier		    Date: 8-Marzo-2017
@ Description: primeros 500 numeros primos
 @ Input: -
 @ Output: NUMEROS PRIMOS
@primes.s
@encontrar e imprimit los primeros 500 numeros primos
@ basados en Knuth TAICP vol1 147ff
@usando las etiquedas que Knuth usa ,sieguiendo cada punto 

@@@@@@@@@@@@
@registers@
@@@@@@@@@@@@

@r1  aputa la direccion del primo 
@ r3 numero  que revisaremos (N en Knuth)
@r4 contrador de primos (J en Knuth)
@r5 divisores que revisaremos 
@r6 indicador para los divisores de los numeros primos 
@r7 podemos recodar (Ren Knuth)
@r8 podemos  tener el cociente(Q en Knuth)
@r9 numeros primos  buscados 

.section	.bss
.comm prime, 2000 @reserva espacio para primos 


.section	.data 
spc:	@espacio para primos   con 3 espacios
	.asciii" 	"
  len=.-spc
  nl: @solo una nueva linea
              .ascii"\n"
       limit: @indicadors para el  ultimo primo que necesitamos
              .long 500
   .section .text
   .globl _start
   _start:
   p1:  @ajustes
   ldr r1,=prime  @r1 apunta al primo
   mov r0,$2      @primer primo es 2 
   str r0, [r1]
   ldr r0,=limit
   ldr r9, [r0]
   mov r3,$3  @inicializa N en 3
   mov r4,$11 @inicializa J en 1 
   
   P2:        @nosotros tres emmos aqui cuando encontremos un primo
   add  r4, r4, $1        @incrementa J
   str r3, [r1,#4]!       @guardar N en "primo"
   
   P3:
   cmp r4, r9     @revisar si se esta haciendo 
   bge P9          @entonces se brinca a P9
   
   P4:
   add r3,r3,$2       @agregar 2 a N
   
   P5:
   ldr r6,=prime
   ldr r5, [r6]
   mov r7,r3
   mov r8,$0
   
   P6:
   cmp r7,r5
   subge r7,r7,r5
   addge r8,r8,$1
   bge P6 
   cmp r7,$0
   beq P4
   
   P7:
   cmp r8,r5
   ble P2
   
   P8:
   mov r7,r3
   mov r8,$0
   ldr r5, [r6,#4]!
   bal P6
   
   
   
   P9:
   mov r0,$1
   mov r4,$0
   mov r5,$0
   ldr r6,=prime
   ldr r3,[r6]
   
   printLoop:
   bl print_num
   add r4, $1
   add r5, $1
   cmp r5, r9
   bge exit 
   cmp r4, $9
   bgt newline 
   ble space
   
   
   
    space:
 mov r0,$1
 ldr r1,=spc
 ldr r2,=len
 mov r7,$4
 svc $0
 ldr r3,[r6,#4]!
 bal printloop
 
 newline:
 mov r0,$1
 ldr r1,=nl
 mov r2,$1
 mov r7,$4
 svc $0
 ldr r3,[r6,#4]!
 mov r4, $0
 bal printLoop
 
 
 
 
 @@@@@@@@@@@@@@@@@@@@
 @print_num function@
 @@@@@@@@@@@@@@@@@@@@
 
print num:
      stmfd sp!,{r0-r9, lr}
      mov r4, $0
      mov r5, $1
      
      
 loop:
    
      cmp r3, $9
      ble stackPush
      sub r3,r3,$10
      add r4,r4,$1
      bal loop
  
  stackPush
      
      add r5,r5,$1
      orr r0,r3,$0x30
      stmfd  sp!,{r0}
      beq printChars
      mov r3,r4
      mov r4,$0
      bal loop
      
     printChars:
     mov r1,sp
     mov r0,$1
     mov r2,$1
     mov r7,$4
     svc $0
     sub r5,r5,$1
     ble return
     ldmfd sp!,{r0}
     bal printChars
 return:
      ldmfd sp!,{r0-r9,pc}
  
  
  
exit:
mov r0,$1                       @ print a newline
ldr r1,=nl
mov r2,$1
mov r7,$4
svc $0
mov r7, $1                      @exit
svc $0

.end 
   
   
   
   
   
   
   
   
   
              
       
     
  
  
